CREATE TYPE TIPO_EQUIPO AS ENUM ('profesional', 'amateur', 'reserva', 'juveniles');

CREATE TYPE TIPO_ESTADISTICA AS ENUM ('penal', 'tarjeta_roja','tarjeta_amarilla', 'gol_favor','gol_contra', 'cambio_entra', 
                                      'cambio_sale', 'titular', 'suplente');
CREATE TYPE TIPO_ROL AS ENUM ('local', 'visitante');

CREATE TYPE TIPO_ARBITRO AS ENUM ('referi', 'asistente', 'jueces_de_linea');

CREATE TYPE TIPO_PERSONAL AS ENUM ('entrenador', 'preparador_fisico', 'medico');

DROP TABLE IF EXISTS club CASCADE;

CREATE TABLE club(nombre_del_club VARCHAR(254), 
                  escudo_del_club VARCHAR(254),
                  cantidad_de_socios INT, 
                  nombre_del_estadio VARCHAR(254),
                  apodo_del_estadio VARCHAR(254), 
                  capacidad_del_estadio INT, 
                  luces_del_estadio VARCHAR(254),
                  cesped_del_estadio VARCHAR(254), 
                  PRIMARY KEY (nombre_del_club)
                  );

   
DROP TABLE IF EXISTS empleados CASCADE;

CREATE TABLE empleados(dni_del_empleado INT,
                       nombre_del_empleado VARCHAR(254), 
                       edad_del_empleado INT,
                       sueldo_del_empleado INT, 
                       fecha_de_ingreso VARCHAR(254), 
                       tiempo_de_contrato INT, 
                       tipo_de_personal TIPO_PERSONAL,
                       posicion_del_jugador VARCHAR(254), 
                       lesion_del_jugador VARCHAR(254), 
                       nombre_del_club VARCHAR(254) REFERENCES club,
                       PRIMARY KEY (dni_del_empleado)
                       );

DROP TABLE IF EXISTS partido CASCADE;

CREATE TABLE partido(nombre_del_club VARCHAR(254), 
                     tipo_de_equipo TIPO_EQUIPO,
                     nombre_del_estadio VARCHAR(254), 
                     dia_y_hora_del_partido VARCHAR(254), 
                     publico_del_partido INT, 
                     resultado_del_partido VARCHAR(254),
                     numero_de_fecha INT, 
                     dni_del_empleado INT REFERENCES empleados, 
                     PRIMARY KEY (nombre_del_club, nombre_del_estadio, dia_y_hora_del_partido)
                     );

DROP TABLE IF EXISTS arbitro CASCADE;

CREATE TABLE arbitro(dni_del_arbitro INT, 
                     tipo_de_arbitro TIPO_ARBITRO,  
                     nombre_del_club VARCHAR(254),
                     nombre_del_estadio VARCHAR(254),
                     dia_y_hora_del_partido VARCHAR(254),
                     PRIMARY KEY (dni_del_arbitro, nombre_del_club),
                     FOREIGN KEY (nombre_del_club, nombre_del_estadio, dia_y_hora_del_partido) REFERENCES partido(nombre_del_club,
                     nombre_del_estadio, dia_y_hora_del_partido));


DROP TABLE IF EXISTS estadistica CASCADE;

CREATE TABLE estadistica(dni_del_empleado INT,
                         nombre_del_estadio VARCHAR(254), 
                         dia_y_hora_del_partido VARCHAR(254),
                         minuto_de_la_estadistica VARCHAR(254), 
                         tipo_de_la_estadistica TIPO_ESTADISTICA, 
                         PRIMARY KEY (minuto_de_la_estadistica, dni_del_empleado, dia_y_hora_del_partido)
                         );

DROP TABLE IF EXISTS rol CASCADE;

CREATE TABLE rol(nombre_del_club VARCHAR(254), 
                 tipo_de_equipo TIPO_EQUIPO,
                 nombre_del_estadio VARCHAR(254), 
                 dia_y_hora_del_partido VARCHAR(254), 
                 rol_del_equipo TIPO_ROL,
                 PRIMARY KEY(nombre_del_club, tipo_de_equipo, dia_y_hora_del_partido, nombre_del_estadio)
                 );

DROP TABLE IF EXISTS campeonato CASCADE;

CREATE TABLE campeonato(nombre_del_club VARCHAR(254), 
                        dni_del_empleado INT, 
                        tipo_del_equipo TIPO_EQUIPO,
                        dni_del_arbitro INT, 
                        dia_y_hora_del_partido VARCHAR(254),
                        minuto_de_la_estadistica VARCHAR(254), 
                        PRIMARY KEY(nombre_del_club, dni_del_empleado, tipo_del_equipo, dni_del_arbitro, dia_y_hora_del_partido, minuto_de_la_estadistica)
                        );

DROP TABLE IF EXISTS posiciones CASCADE;

CREATE TABLE posiciones(
        equipo VARCHAR(254),
        puntos INT,
        goles_a_favor INT,
        goles_en_contra INT,
        partidos_jugados INT,
        partidos_ganados INT,
        partidos_perdidos INT,
        partidos_empatados INT,
        PRIMARY KEY(equipo)
        );

CREATE OR REPLACE FUNCTION actualizar_puntos() RETURNS trigger AS $actualizar_puntos$
BEGIN
    IF (TG_OP = 'INSERT') THEN
        IF (new.resultado_del_partido = 'G') THEN
            UPDATE  posiciones 
            SET     puntos = puntos + 3, partidos_jugados = partidos_jugados + 1, partidos_ganados = partidos_ganados + 1
            WHERE equipo = new.nombre_del_club; 
        END IF;
        IF (new.resultado_del_partido = 'E') THEN
            UPDATE  posiciones 
            SET     puntos = puntos + 1, partidos_jugados = partidos_jugados + 1, partidos_empatados = partidos_empatados + 1
            WHERE equipo = new.nombre_del_club;
        END IF;
        IF (new.resultado_del_partido = 'P') THEN
            UPDATE  posiciones 
            SET     partidos_jugados = partidos_jugados + 1, partidos_perdidos = partidos_perdidos + 1
            WHERE equipo = new.nombre_del_club;
        END IF;
    END IF;
    RETURN new;
END;
$actualizar_puntos$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS actualizar_puntos ON partido;
CREATE TRIGGER actualizar_puntos AFTER INSERT
ON partido FOR EACH ROW EXECUTE PROCEDURE actualizar_puntos();

CREATE OR REPLACE FUNCTION actualizar_estadisticas() RETURNS trigger AS $actualizar_estadisticas$
BEGIN
    IF (TG_OP = 'INSERT') THEN
        IF (new.tipo_de_la_estadistica = 'gol_favor') THEN
            UPDATE posiciones SET goles_a_favor = goles_a_favor + 1
            WHERE equipo = (SELECT nombre_del_club FROM empleados
                WHERE empleados.dni_del_empleado = new.dni_del_empleado);
        END IF;
        IF (new.tipo_de_la_estadistica = 'gol_contra') THEN
            UPDATE posiciones SET goles_en_contra = goles_en_contra + 1
            WHERE equipo = (SELECT nombre_del_club FROM empleados
                WHERE empleados.dni_del_empleado = new.dni_del_empleado);
        END IF;
    END IF;
    RETURN new;
END;

$actualizar_estadisticas$ LANGUAGE plpgsql; 

DROP TRIGGER IF EXISTS actualizar_estadisticas ON estadistica;

CREATE TRIGGER actualizar_estadisticas AFTER INSERT
  ON estadistica FOR EACH ROW EXECUTE PROCEDURE actualizar_estadisticas();

CREATE OR REPLACE FUNCTION actualizar_equipos() RETURNS trigger AS $actualizar_equipos$
BEGIN
    IF (TG_OP = 'INSERT') THEN
        INSERT INTO posiciones VALUES(new.nombre_del_club, 0, 0, 0, 0, 0, 0, 0);
    END IF;
    IF (TG_OP = 'UPDATE') THEN
        UPDATE posiciones SET equipo = new.nombre_del_club
        WHERE equipo = old.nombre_del_club;
    END IF;
    RETURN new;
END;

$actualizar_equipos$ LANGUAGE plpgsql; 

DROP TRIGGER IF EXISTS actualizar_equipos ON club;

CREATE TRIGGER actualizar_equipos AFTER INSERT OR UPDATE
  ON club FOR EACH ROW EXECUTE PROCEDURE actualizar_equipos();

